import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'

const state = {
  // 初始化token
  token: getToken(),
  userInfo: {} // 用户信息
}
const mutations = {
  // 设置token
  setToken(state, token) {
    state.token = token
    // 同步缓存
    setToken(token)
  },
  // 移除token
  removeToken(state) {
    state.token = null
    // 同步缓存
    removeToken()
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = { ...userInfo } // 用 浅拷贝的方式去赋值对象 因为这样数据更新之后，才会触发组件的更新
  },
  // 移除用户信息
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
const actions = {
  // 异步获取token
  async login(content, data) {
    const res = await login(data)
    if (res) {
      content.commit('setToken', res)
    }
    setTimeStamp()
  },
  // 异步获取用户信息
  async getUserInfo(context) {
    const result = await getUserInfo()
    const baseInfo = await getUserDetailById(result.userId)
    // 此时已经获取到了用户的基本资料 迫不得已 为了头像再次调用一个接口
    context.commit('setUserInfo', { ...result, ...baseInfo })
    // context.commit('setUserInfo', { ...result })
    return result // 这里为什么要返回 为后面埋下伏笔
  },
  // 登出
  logout(context) {
    context.commit('removeToken')
    context.commit('removeUserInfo')
    resetRouter()
    context.commit('permission/setRoutes', [], { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
